/*
================================================================================
	Plik: f_brcc.c
--------------------------------------------------------------------------------
	Autorzy: Piotr Zdunek, Mateusz Słowikowski, Krzysztof Wiąckowski
	Projekt:Model mikrokontrolera AVR
	Kompilator: avr-gcc-4.3.5
	Doc: doxygen 1.7.4
--------------------------------------------------------------------------------
	Zawiera:
--------------------------------------------------------------------------------
	Komentarze:
================================================================================
*/

/*! \file f_brcc.c
 * \brief Plik opisujący funkcję BRCC
 */

#include "types.h"
#include "mem_abs.h"

/*
 * Funkcja BRCC Branch if Carry Cleared. Branch czyli skok. Jeśli w wyniku poprzedni0
 * wykonanej operacji została wyzerowana flaga C, to ma być skok do innego adresu. Czyli ma być
 * Zwiększone PC k o k. K zawiera się w przedziale (-64,+64). Nie testowałem czy działa do tyłu, ale
 * teoretycznie powinno.
 *
 * Przykład kodu assemblera, który testuje tę funkcję
 *
 * add r5,r6 ; r5 = 5,r6 = 9
 * branch przep
 * and r1,r2
 * and r2,r3
 * and r3,r4
 * ...
 * przep: nop
 * and r1,r2 <- test czy kolejna operacja się wykoan
 *
 */

void F_BRCC(void){

<<<<<<< .mine
/*!  void F_BRCC(void){}
	 *  \n \n
	 *  BRCC (Branch if Carry Cleared) \n
	 *  Branch czyli skok. Jeśli w wyniku poprzednio
	 *	wykonanej operacji została wyzerowana flaga C, to ma zostać wykonany skok do innego adresu.
	 *
	 *  \ref pagebrcc \n
	 */

	#ifndef  DEBUG_MODE
		printf("Function BRCC.");
	#endif

	int k_temp = (getMEMC(getPC()) & 0x0FFF);
	int8_t k = (k_temp & 0b001111111000) >> 3;   	// maska zgodnie z instruction set manual
													//	wyłuskanie wartosci zmiennej k (offsetu)
// Sprawdzenie warunku ustawienia flagi C
// jeśli warunek jest spełniony to skok o k
// jeśli nie to skok o 1
	if( GetFlagRegisterStatus(FLAG_C) == 0) incPC_k(k);
	else incPC();

}
/*! \page pagebrcc Opis działania funkcji BRCC
 *
 *  BRCC (Branch if Carry Cleared) \n
 *  Branch czyli skok. Jeśli w wyniku poprzednio
 *	wykonanej operacji została wyzerowana flaga C, to ma zostać wykonany skok do innego adresu.
 *
 *	\dontinclude f_brcc.c
 *
 *	\section sec_brcc2 Wykonywane operacje
 *
 *	1. Pobranie informacji o k:
 *	\skipline k_temp
 *	\until 3
 *	2. Sprawdzenie warunku ustawienia flagi C jeśli warunek jest spełniony to skok o k, jeśli nie to skok o 1
 *	\skipline incPC_k
 *	\until incPC
 *
 *	\section sec_brcc3 Kod źródłowy funkcji
 *
 *	\include f_brcc.c
 *
 */
